home *** CD-ROM | disk | FTP | other *** search
/ PC Media 20 / PC MEDIA CD20.iso / share / prog / cursoasm / cap4.msg < prev    next >
Encoding:
Text File  |  1993-06-17  |  9.3 KB  |  174 lines

  1.                   INTRODUCCION AL ASM: LA INSTRUCCION MOV (II)
  2.                   ============================================
  3.  
  4.    Continuamos con los modos de direccionamiento que admite el 8086. Para
  5. poder dar una tabla completa con todos los modos de direccionamiento que
  6. faltan, introduzco dos registros que todavía no habíamos visto: el primero es
  7. el registro 'SS' (de 'Stack Segment', 'segmento de pila'), que es otro registro
  8. que se usa como el CS, el DS y el ES para construir direcciones completas. La
  9. instrucción 'MOV' se puede usar con este registro de la misma manera que con
  10. los otros tres registros de segmento. El otro registro es el 'BP' (de 'Base
  11. Pointer', 'puntero base'). Este registro se puede utilizar de la misma forma
  12. que los registros de propósito general, aunque no se puede acceder por separado
  13. a los bytes alto y bajo. Además veremos como presenta algunos modos de direc-
  14. cionamiento peculiares.
  15.  
  16.    Para no alargarme demasiado, presento una tabla con una instrucción de cada
  17. modo de direccionamiento. Ya que el valor que indica la posición de memoria es
  18. siempre un valor de 16 bits, se complementa con un registro de segmento para
  19. formar la dirección absoluta. En la tabla aparece también el segmento que el uP
  20. toma por defecto para completar la dirección. Más adelante veremos cómo podemos
  21. hacer que una instrucción use el registro de segmento que nos interese en lugar
  22. del registro por defecto.
  23.  
  24.    INSTRUCCION            REGISTRO POR DEFECTO
  25.   -------------------- --------------------------
  26.    MOV AX,[BX+SI+xx]           DS
  27.    MOV AX,[BX+DI+xx]           DS
  28.    MOV AX,[BP+SI+xx]           SS <- !!
  29.    MOV AX,[BP+DI+xx]           SS <- !!
  30.    MOV AX,[SI+xx]              DS
  31.    MOV AX,[DI+xx]              DS
  32.    MOV AX,[BP+xx]              DS
  33.    MOV AX,[BX+xx]              DS
  34.  
  35.    Estos modos de acceso a memoria se añaden a los ya vistos en el capítulo
  36. anterior, que aparecen en la siguiente tabla:
  37.  
  38.    INSTRUCCION               DESCRIPCION
  39.   --------------------      --------------------------------------------------
  40.    MOV AX,BX                 Transferencia de un registro a otro
  41.    MOV AX,55AAh              Carga de un registro directamente con un valor
  42.    MOV AX,[55AAh]            Transferencia de una dirección de memoria dada
  43.                              directamente a un registro
  44.    MOV AX,[BX]               Acceso a memoria por medio del BX
  45.    MOV AX,[SI]               Acceso a memoria por medio del registro índice SI
  46.    MOV AX,[DI]               Acceso a memoria por medio del registro índice DI
  47.    MOV AX,[BP]               Acceso a memoria por medio del registro BP
  48.  
  49.    Estas instrucciones, que ya vimos, generan accesos a memoria completando la
  50. dirección, por defecto, con el DS.
  51.  
  52.    También son posibles las instrucciones generadas invirtiendo los operandos
  53. de las instrucciones de ambas tablas. Es decir, todos estos modos de direccio-
  54. namiento pueden usarse tanto para lectura (en las tablas) como para escritura.
  55.  
  56.    Y para acabar con los modos de direccionamiento, tenemos uno bastante pecu-
  57. liar que describimos dando un ejemplo:
  58.  
  59.         MOV [55AAh], 3322h
  60.  
  61.    Esta instrucción almacena en la dirección 55AAh el valor 3322h, sin acceder
  62. en toda la operación a ningún registro.
  63.  
  64.    Pero las instrucciónes que almacenan directamente un valor en memoria pre-
  65. sentan un problema para el ensamblador: cuando uno de los dos operandos (el
  66. destino o el origen) es un registro, con ése operando se fija el tamaño del
  67. dato a mover. Pero en este caso, es necesario indicar al ensamblador el tamaño
  68. del dato a mover, de forma que pueda generar el código de operación correspon-
  69. diente. Esto se puede hacer añadiendo a cualquiera de los operandos unas pala-
  70. bras que indican si se refiere a un operando de tipo byte o de tipo palabra.
  71. En los siguientes ejemplos se ve cómo se hace esto:
  72.  
  73.         MOV WORD PTR [55AAh],3322h    ; almacena los dos bytes
  74.         MOV BYTE PTR [55AAh],20h    ; almacena un solo byte
  75.         MOV WORD PTR [BX],0        ; almacena dos bytes
  76.  
  77.    Estos 'typecasts', que es como se denominan formalmente, pueden añadirse en
  78. todos los casos, pero no son imprescindibles. A modo de ejemplo, las instruc-
  79. ciones siguientes son aceptadas por el ensamblador:
  80.  
  81.         MOV AX,WORD PTR [BX]
  82.         MOV BYTE PTR [BP+4],CL
  83.  
  84.    Ahora que ya conocemos algunas de las instrucciones que podemos emplear en
  85. ensamblador, veremos cómo podemos experimentar con ellas y ver cómo se modifi-
  86. can los registros. Para ello usaremos el DEBUG del MS-DOS, pero fácilmente po-
  87. demos hacer lo mismo con el SID del DR-DOS o con el SYMDEB, que es un DEBUG
  88. bastante mejorado, también de Microsoft.
  89.  
  90.    Lo primero es cargar el DEBUG sin ningún parámetro desde la línea de coman-
  91. dos del DOS. Entonces aparece un mensaje de copyright en la pantalla, tras lo
  92. que tendremos un guión ('-') que es prompt con el que DEBUG nos invita a que
  93. introduzcamos un comando. Si escribimos 'R' y pulsamos RETURN, el programa
  94. nos muestra el contenidos actual de los registros del 8086 y la instrucción
  95. apuntada por el par CS:IP, que es la siguiente instrucción que debe ejecutar
  96. el uP. El comando 'T' ejecuta la siguiente instrucción y vuelve a mostrar los
  97. registros. El registro IP habrá variado, de manera que apuntará a la siguiente
  98. instrucción.
  99.  
  100.    Uno de los comandos que más usaremos para experimentar con el DEBUG será
  101. el comando 'A', que nos permite introducir código fuente en ASM (instrucciones
  102. en lenguaje ensamblador) y lo ensamblará en la dirección apuntada por CS:IP.
  103. Cuando queramos volver al prompt del DEBUG, pulsaremos RETURN al principio de
  104. una línea. Para desensamblar el código a partir de la dirección actual usare-
  105. mos el comando 'U' de 'unassemble' ('desensamblar'). Tanto el comando 'A' como
  106. el comando 'U' aceptan opcionalmente una dirección de memoria (en hexadecimal,
  107. ya que a DEBUG hay que darle todos los números en hex.), que puede ser una di-
  108. rección compuesta por segmento y offset (con ':' en medio) o sólo por un
  109. 'offset' (y se asume el CS actual).
  110.  
  111.    Por ejemplo, podemos probar las siguientes indicaciones:
  112.  
  113.     -Cargar DEBUG, escribir 'A' y pulsar RETURN.
  114.     -Aparecerá la dirección de memoria actual (xxxx:100, donde xxxx puede
  115.      variar), seguida de un cursor. Podemos escribir instrucciones ASM.
  116.      Escribimos 'MOV AX,2233' y pulsamos RETURN.
  117.     -Escribimos 'MOV AH,0' y pulsamos RETURN.
  118.     -Pulsamos RETURN, con lo que volveremos al prompt de DEBUG.
  119.     -Escribimos 'T' y pulsamos RETURN, con lo que se ejecuta la primera
  120.      instrucción e IP avanza a 102h. Podemos observar que AX ahora vale
  121.      2233, debido al 'MOV AX,2233' que acabamos de ejecutar.
  122.     -Escribimos de nuevo 'T' y pulsamos RETURN, con lo que se ejecuta la
  123.      siguiente instrucción. Podemos observar que el contenido de AX es
  124.      ahora 0033, ya que hemos almacenado el valor 00 en AH, que es el byte
  125.      alto de AX.
  126.  
  127.    Os recomiendo que experimentéis con los distintos modos de direccionamiento.
  128. Con el comando 'D' podéis ver el contenido de una zona de memoria, dando como
  129. parámetro la dirección a partir de la que mostrar el contenido. Esta dirección
  130. puede ser de la forma SEG:OFF, o puede ser un offset, tomándose en tal caso el
  131. valor de DS para completar la dirección.
  132.  
  133.    Ahora introduciremos las instrucciones aritméticas del 8086, al menos las
  134. básicas, de forma que podréis experimentar con ellas en el DEBUG. Se presenta
  135. una tabla con la descripción de cada una, ya que su comprensión no ofrece gran
  136. dificultad. Después de la tabla se comentan con más detalle las instrucciones:
  137.  
  138.         INSTRUCCIONES ARITMETICAS BASICAS
  139.        -----------------------------------
  140.     Instrucción            Descripción
  141.    ....................   ....................................................
  142.     ADD destino,origen     Suma los operandos origen y destino, y almacena el
  143.                            resultado en destino.
  144.     SUB destino,origen     Resta los operandos origen y destino, y almacena el
  145.                            resultado en destino.
  146.     INC destino            Suma 1 (incrementa) al operando destino.
  147.     DEC destino            Resta 1 (decrementa) al operando destino.
  148.     NEG destino            Asigna al operando destino el complemento a dos del
  149.                            contenido anterior del operando destino. Esto repre-
  150.                            senta cambiar el signo de un número binario.
  151.  
  152.    Las instrucciones ADD y SUB aceptan exactamente los mismos modos de direc-
  153. cionamiento que la instrucción MOV, por lo que todos los ejemplo dados antes
  154. sirven para estas instrucciones sin más que cambiar el MOV por el ADD o el SUB.
  155. Exceptuando que sólo se pueden aplicar estas operaciones a los registros AX,
  156. BX, CX, DX, SI, DI, BP y a los registros de un byte (AL, AH,...), pero no a los
  157. registros de segmento.
  158.  
  159.    Las instrucciones INC, DEC y NEG aceptan como operando un registro (que no
  160. sea de segmento) o una referencia a memoria, usando cualquiera de los modos de
  161. direccionamiento descritos para la instrucción MOV.
  162.  
  163.    En el siguiente capítulo introduciremos la pila de la máquina, y puede que
  164. las interrupciones.
  165.  
  166.    Después, con todos estos conceptos comenzaremos a describir el uso de los
  167. ensambladores como el MASM o el TASM, veremos el famoso 'Hello, world' en ASM
  168. y seguiremos con el juego de instrucciones del 8086: saltos condicionales (y
  169. veremos los flags), comparaciones, etc... En muy poco tiempo estaréis todos
  170. programando en ASM. ¡¡¡Animad a la gente a que se apunte!!!
  171.  
  172.    Salut! :-)
  173.  
  174.    Jon